package cn.dduan.fool.design.pattern.great.factory;

/**
 * 简单工厂模式
 * <p>
 * 优点：
 * 1、定义一个创建对象的接口，将对象的创建和本身的业务逻辑分离，降低系统的耦合度
 * 2、使得两个修改起来相对容易些，当以后实现改变时，只需要修改工厂类即可
 * <p>
 * 缺点：
 * 1、不符合【开闭原则】每次添加新产品需要修改原工厂类，为了解决问题，出现了【工厂方法模式】
 */

/**
 * 工厂类
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
public class SimpleFactory {
    public BMW create(int type) {
        switch (type) {
            case 320:
                return new BMW320();
            case 523:
                return new BMW523();
        }
        return null;
    }

    public static void main(String[] args) {
        SimpleFactory factory = new SimpleFactory();
        BMW bmw320 = factory.create(320);
        BMW bmw523 = factory.create(523);
    }

}

/**
 * 产品类-宝马汽车
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
abstract class BMW {
    public BMW() {
    }
}

class BMW320 extends BMW {
    public BMW320() {
        System.out.println("制造-->" + this.getClass().getSimpleName() + "");
    }
}

class BMW523 extends BMW {
    public BMW523() {
        System.out.println("制造-->" + this.getClass().getSimpleName());
    }
}